#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMovie>
#include <QTableWidget>
#include <QTimer>
#include <QMap>
#include <qtreewidget.h>
#include"database.h"
#include "relievepage.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

    //报警类别的枚举
    enum WanningType{wanning_1,wanning_2,wanning_3,noWanning};
    //每列的值
    enum FieldColNum{colDot=0,colSite,colWanning,colTime};
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QString Root;  //管理员
    QString EventDescriptiondata1;  //事件描述

    int errorNumber[3] = {0, 0, 0 };//统计不同警报的个数

    int rowNo = 0; //指明行数
    QMap <QString,int> errorMap;//使用map容器存放警报站点   key:出错站点 value:警报类型

    QList<QList<QString> >listArea; //所有区域

    QList< QList<QString> > listSite; //所有站点

    QList<QString> errorSiteList; //出现故障的站点

    QMovie* getMovie(QString DotNameOne);//获取具体的QMovie


    void addDot(QString DotName,int x,int y);//添加一个圆点

    void createItemsARow(QString siteName,QString DotName,WanningType errorCategory,QString time,QTableWidget *widget);//添加table 参数

    void makeWanning();//随机产生告警

    void emitWanning(QString siteName,QString DotName,WanningType errorType,QString time);//随机产生告警发送信号  作用：封装，减少代码量

    void setHeader(QTableWidget *tablewidget);//设置表头

    void addDotList( QList<QList<QString>> listArea1);//初始化主页面的圆点


    void mousePressEvent(QMouseEvent *ev);//鼠标按下事件重写

    void departTree(QString root, QTreeWidgetItem *item);  //后续递归调用，插入到父亲节点

    void departTree(QString root,QTreeWidget *tree);       //第一次插入，根节点，最高级部门

    void updateAbstract();  //更新系统运行摘要的站点数量

    void updateTable(QString siteName,int errorCategory);  //更新警告列表信息  站点名  警告类型

    void updateTreeToRed(QString siteName);  //更新列表信息  异常的变红

    void updateTreeToNormal(QString siteName);  //更新列表信息  恢复正常

private:
    Ui::MainWindow *ui;
    QTimer timer; //随机产生警告的定时器
    QTableWidget *widget; //作为半屏弹出的警告列表
    Database DB;  //数据库
    relievePage *relPage;

    //初始化所有的点的QMovie
    QMovie *movie1 = new QMovie(":/res/wanning1.gif");
    QMovie *movie2 = new QMovie(":/res/wanning2.gif");
    QMovie *movie3 = new QMovie(":/res/wanning3.gif");
    QMovie *movie4 = new QMovie(":/res/wanning3.gif");
    QMovie *movie5 = new QMovie(":/res/wanning3.gif");
    QMovie *movie6 = new QMovie(":/res/wanning3.gif");
    QMovie *movie7 = new QMovie(":/res/wanning3.gif");
    QMovie *movie8 = new QMovie(":/res/wanning3.gif");
    QMovie *movie9 = new QMovie(":/res/wanning3.gif");

    //信号
signals:
    void warning1(QString DotName);  //一级预警信号
    void warning2(QString DotName);  //二级预警信号
    void warning3(QString DotName);  //三级预警信号
    void relieve(QString DotName);   //解除预警
    void getAllSite(QString DotName);
    void getSite(QString siteName,QString DotName,WanningType errorCategory,QString time);  //发送站点名字
    void getSiteCommon(QString DotName);  //发送站点名字
    void getDotName(QString DotName);
    void mousePressEvent1();  //点击窗口的信号

    void secPlanChange(QString DotName,QString siteName);  //去改变二级平面图信息
    void relieveChange(QString DotName,QString siteName,int error);  //改变解除页面的信息

    //发送预警信号  日志页面接收
    //参数：dotName区域名  siteName站点名 errorCategorys事件类型 time警告时间  root操作者
    void recordError(QString dotName,QString siteName,int errorCategory,QString time,QString root);
    //发送解除预警信号  日志页面接收
    //参数：dotName区域名  siteName站点名 errorCategorys事件类型 time解除警告时间  root操作者

public slots:
    void getRoot(QString root);//获取用户名字
private slots:
    void on_pushButton_8_clicked(bool checked);
    void  ShowTime(); //显示时间
    void on_pushButton_clicked(); //账户管理按钮
    void on_pushButton_5_clicked(); //treewidget展开
    void on_pushButton_6_clicked();//treewidget收起
    void on_pushButton_7_clicked(bool checked);  //显示异常站点的按钮
    void selectHero(QTreeWidgetItem*,int); // treewidget 双击信号  作用：弹出二级平面图
    void on_pushButton_3_clicked();
};
#endif // MAINWINDOW_H
